import fs from 'fs'
import sugar from '../core/sugar';
import config from '../init/ConfigHandler'

//工具 方法集
export = class{
    /***
     * 获取时间 Y年 m月 d日 H时 i分 s秒
     * @param str
     * @param timestamp
     * @returns {string}
     */
    static date(str="",timestamp): string{
        !timestamp && (timestamp=new Date())
        const date = new Date(timestamp);
        const Y = date.getFullYear();
        const m = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;
        const d = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
        const H = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
        const i = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
        const s = date.getSeconds() < 10 ? '0' + date.getDate() : date.getSeconds();
        //执行替换
        // 'Y-m-d H:i:s'
        // @ts-ignore
        return str.replace('Y',Y+"").replace('m',m).replace('d',d).replace('H',H).replace('i',i).replace('s',s);
    }

    /***
     * 获取时间戳
     * @returns {number}
     */
    static time(): number{
        return Date.now();
    }

    /***
     * 获取本机所有的ip地址
     * @returns {*[]}
     */
    static local_ip(): any[]{
        let os = require('os');
        let ip = os.networkInterfaces();
        let IP = [];
        Object.keys(ip).forEach(e=>{
            IP.push(...ip[e].filter(res=>{
                if((/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/).test(res.address)){
                    return res;
                }
            }))
        })
        return IP;
    }


    /***
     * 检查路径是否为某个文件的地址
     * @param url
     * @returns {string|boolean}
     */
    static isFile_Path(url:string): string | boolean{
        let copy = sugar.path(config.getAddress("public") + url);
        // 存在并且是一个文件
        if(fs.existsSync(copy) && fs.statSync(copy).isFile()){return copy}

        //没有后缀并且最后没有/
        // if(url.endsWith("/")){copy+="index.html"}else{}
        copy+="/index.html";
        //判断是否是公共文件
        if(fs.existsSync(copy)){
            //文件存在,但是尾部没有/ 进行重定向
            if(!url.endsWith("/")){
                global.async_global.res.writeHead(301,
                    {Location: url+"/"}
                );
            }
            // 返回这个文件的地址
            return copy;
        }else{
            return false;
        }
    }

    static isAsync (func:Function) {
        const string = func.toString().trim();
        return !!(
            // 本地的
            string.match(/^async /) ||
            // babel (this may change, but hey...)
            string.match(/return _ref[^\.]*\.apply/)
            // 插入另一个脏转换器检查
            // 还有其他更复杂的情况，可能需要您检查返回行*承诺*
        );
    }
    
    /** 获取下一个月的天数 */
    static getNextMonthNumberDays(date:any=new Date(),month:number=1){
      let d = new Date();;
      if(date){
          d = new Date(date);
      }
      // 将日期设置为下月一号
      d.setMonth(d.getMonth()+month)
      d.setDate(1)
      // 获取本月最后一天
      d.setDate(d.getDate()-1)
      return d.getDate()
    }
      
    /** 获取某一年的天数 */
    static getYearsDaysNumber(date:string){
        let numberDays = 0;
        for(let i=1; i<13; i++){
            numberDays += this.getNextMonthNumberDays(date,i);
        }
        return numberDays;
    }

    /** 获取当前月份 */
    static getCurrentMonth(){
        return (new Date()).getMonth()+1;
    }

    static formatt(date:any){
        let now = new Date(date);
        
        let year = now.getFullYear();       //年
        let month = now.getMonth() + 1;     //月
        let day = now.getDate();            //日
        
        let hh = now.getHours();            //时
        let mm = now.getMinutes();          //分
        let ss = now.getSeconds();           //秒
        
        let clock = year + "-";
        
        if(month < 10)
            clock += "0";
        
        clock += month + "-";
        
        if(day < 10)
            clock += "0";
            
        clock += day + " ";
        
        if(hh < 10)
            clock += "0";
            
        clock += hh + ":";
        if (mm < 10) clock += '0'; 
        clock += mm + ":"; 
        
        if (ss < 10) clock += '0'; 
        clock += ss; 
        return(clock); 

    }

}